﻿using System;
using System.Collections.Generic;
using System.Linq;
using ControleRepresentanteSync.Application.DynamicSync;
using ControleRepresentanteSync.ControleRepresentanteServices;
using ControleRepresentanteSync.Logic.Models;

namespace ControleRepresentanteSync.Application.Pedido
{
    class PedidoPresenter : DynamicSyncContentPresenter<IPedidoViewModel>
    {
        public PedidoPresenter(IPedidoViewModel viewModel, Logic.Models.Pedido pedido, IViewModelFactory viewModelFactory, IEnumerable<AttributeContract> attributes, IEnumerable<ITransportadoraItem> transportadoras, IEnumerable<IClienteItem> clientes, IEnumerable<IVendedorItem> vendedores, IEnumerable<IFabricaItem> fabricas)
            : base(viewModel)
        {
            foreach (IClienteItem cliente in clientes)
            {
                viewModel.Clientes.Add(cliente);
            }
            foreach (IFabricaItem fabrica in fabricas)
            {
                viewModel.Fabricas.Add(fabrica);
            }
            foreach (ITransportadoraItem transportadora in transportadoras)
            {
                viewModel.Transportadoras.Add(transportadora);
            }
            foreach (IVendedorItem vendedor in vendedores)
            {
                viewModel.Vendedores.Add(vendedor);
            }

            viewModel.AttributeList = viewModelFactory.CreateViewModel<IAttributeListViewModel>();
            new AttributeListPresenter(viewModel.AttributeList, attributes, viewModelFactory);
            IAttributeItem attributeItem = viewModel.AttributeList.Attributes.FirstOrDefault(x => x.Contract.Id == new Guid("4a6a8395-5109-433a-aef8-650a27334255"));
            if (attributeItem != null)
            {
                attributeItem.Value = pedido.OCCliente;
            }

            viewModel.Numero = pedido.Numero;
            viewModel.Data = pedido.Data ?? DateTime.Today;
            viewModel.Observacao = pedido.Observacao;
            viewModel.CondicaoPagamento = pedido.CondicaoPagamento;
            viewModel.Desconto = pedido.Desconto ?? 0;
            viewModel.PrazoEntrega = pedido.PrazoEntrega.HasValue ? pedido.PrazoEntrega.Value.ToShortDateString() : null;

            viewModel.Pecas = pedido.Produtos.Sum(x => x.Quantidade ?? 0);
            viewModel.TotalMercadoria = pedido.TotalMercadoria;
            viewModel.ValorDesconto = pedido.ValorDesconto;

            viewModel.Produtos.Clear();
            viewModel.ValorImposto = pedido.ValorImposto;
            foreach (Produto produto in pedido.Produtos)
            {
                IProdutoItem produtoItem = viewModelFactory.CreateViewModel<IProdutoItem>();
                new ProdutoItemPresenter(produtoItem, produto);
                viewModel.Produtos.Add(produtoItem);
            }

            viewModel.TotalLiquido = pedido.TotalLiquido;

            viewModel.Transportadora = pedido.CodigoTransportadora.HasValue
                ? transportadoras.FirstOrDefault(x => x.Contract.CodigoJolitex == pedido.CodigoTransportadora)
                : null;
            viewModel.CanChangeTransportadora = viewModel.Transportadora == null;

            viewModel.Cliente = clientes.FirstOrDefault(x => x.Contract.CodigoJolitex == pedido.CodigoCliente);
            viewModel.CanChangeCliente = viewModel.Cliente == null;

            if (viewModel.Cliente != null)
            {
                ClienteContract clienteContract = viewModel.Cliente.Contract;
                viewModel.Vendedor = vendedores.FirstOrDefault(x => x.Contract.Id == clienteContract.VendedorId);
            }

            UpdateIsValid();
        }

        protected override bool IsValid()
        {
            return ViewModel.Cliente != null &&
                   ViewModel.Fabrica != null &&
                   ViewModel.Transportadora != null &&
                   ViewModel.Vendedor != null;
        }

        public override void Dispose()
        {
            base.Dispose();
            
            foreach (IProdutoItem produtoItem in ViewModel.Produtos)
            {
                produtoItem.FireOnClose();
            }

            ViewModel.AttributeList.FireOnClose();
        }
    }
}